package com.learn.java3y.java.javaArithmetic.LeetCode;

public class LeetCode260 {


    // 给定一个整数数组 nums，其中恰好有两个元素只出现一次，其余所有元素均出现两次。 找出只出现一次的那两个元素。
    //https://leetcode-cn.com/problems/single-number-iii/description/

    public int[] singleNumber(int[] nums) {
        int sum = 0;    //记录所有异或的值，即两个只出现一次数的异或
        for (int i = 0; i < nums.length; i++) {
            sum ^= nums[i];
        }
        int[] res = new int[2];

        sum &= -sum;    //得出两个数异或结果的最右边的一个1，其他的为零，这样进行&操作就可以将两个不同的数分到不同的两组去
        for (int i = 0; i < nums.length; i++) {
            if ((sum & nums[i]) == 0)
                res[0] ^= nums[i];
            else
                res[1] ^= nums[i];
        }
        return res;
    }

}
